﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Emporium_Web.Controls;
using System.Web.UI.WebControls;
using Emporium_Web.DBML;

namespace Emporium_Web
{
    public partial class PedidoCompraEstiloAdd : System.Web.UI.UserControl
    {
        public event EventHandler Seleccionado;

        protected virtual void OnSeleccionado(EventArgs e)
        {
            if (Seleccionado != null)
                Seleccionado(this, e);
        }



        public string SortExpression
        {
            get
            {
                return ViewState["gv_SortExpression"] == null ? "" : ViewState["gv_SortExpression"].ToString();
            }
            set
            {
                ViewState["gv_SortExpression"] = value;
            }
        }

        public string SortDirection
        {
            get
            {
                return ViewState["gv_SortDirection"] == null ? "" : ViewState["gv_SortDirection"].ToString();
            }
            set
            {
                ViewState["gv_SortDirection"] = value;
            }
        }

        public int CodigoSeleccionado
        {
            get
            {
                return ViewState["CodigoSeleccionado"] == null ? 0 : Convert.ToInt32(ViewState["CodigoSeleccionado"]);
            }
            set
            {
                ViewState["CodigoSeleccionado"] = value;              
            }
        }

        public string DescripcionSeleccionado
        {
            get
            {
                return ViewState["DescripcionSeleccionado"] == null ? string.Empty : ViewState["DescripcionSeleccionado"].ToString();
            }
            set
            {
                ViewState["DescripcionSeleccionado"] = value;                
            }
        }        

        protected string _validationGroup;
        public string ValidationGroup
        {
            get
            {
                return _validationGroup;
            }
            set
            {
                _validationGroup = value;
            }
        }

        /// <summary>
        /// Es el código de estilo
        /// </summary>
        public int EstiloId
        {
            get { return ViewState["EstiloId"] == null ? -1 : (int)ViewState["EstiloId"]; }
            set { ViewState["EstiloId"] = value; }
        }

        /// <summary>
        /// Los componentes.
        /// </summary>
        private List<PedidoContador> PedidoContadorList
        {
            get
            {
                return ViewState["PedidoContadorList"] == null ? null : (List<PedidoContador>)ViewState["PedidoContadorList"];
            }
            set
            {
                ViewState["PedidoContadorList"] = value;
            }
        }

        [Serializable]
        private class PedidoContador
        {
            public int CodigoPedido { get; set; }
            public int PrendasProducir { get; set; }
            public int PrendasSolicitadas { get; set; }
            public decimal Total { get; set; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {            
            errorMessage.Visible = false;
            PedidoContadorList = new List<PedidoContador>();
        }

        public void Mostrar()
        {            
            mpeBusquedaPedidoCompra.Show();
        }
       

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < gvPedidoCompras.Rows.Count; i++)
            {
                if ((int)gvPedidoCompras.DataKeys[i][0] == Convert.ToInt32(hdnSeleccion.Value))
                {
                    CodigoSeleccionado = Convert.ToInt32(hdnSeleccion.Value);                    
                    OnSeleccionado(e);
                    return;
                }
            }
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                ListarPedidoCompras();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }



        protected void gvPagerPageChanged(object sender, DataNavigatorEventArgs e)
        {
            try
            {
                ListarPedidoCompras();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvPedidoCompras_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var pedido = (CO_PedidoCompra)(e.Row.DataItem);
               
                if (PedidoContadorList.Count > 0 && PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id) != null)
                {                    
                    Label lblPrendasSol = (Label)e.Row.FindControl("lblPrendasSol");
                    if (lblPrendasSol != null && lblPrendasSol.Text == string.Empty)
                    {
                        lblPrendasSol.Text = PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id).PrendasSolicitadas.ToString();
                    }

                    Label lblPrendasProd = (Label)e.Row.FindControl("lblPrendasProd");
                    if (lblPrendasProd != null && lblPrendasProd.Text == string.Empty)
                    {
                        lblPrendasProd.Text = PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id).PrendasProducir.ToString();
                    }
                }
            }
        }

        protected void gvPedidoCompras_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (gvPedidoCompras.HeaderRow == null)
                {
                    return;
                }

                this.SortExpression = e.CommandArgument != null ? e.CommandArgument.ToString() : "Id";
                this.SortDirection = e.CommandName.Equals("SortUp") ? "ASC" : "DES";

                ListarPedidoCompras();

            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }       

        public void ListarPedidoCompras()
        {
            TablasDataContext database = new TablasDataContext();
            List<CO_PedidoCompra> lstPedidoCompra = new List<CO_PedidoCompra>();
            
            var listarQuery = from pedidosEstilo in database.CO_PedidoEstilo
                              where pedidosEstilo.Estilo_Id == this.EstiloId || this.EstiloId < 0
                              select pedidosEstilo.CO_PedidoCompra;

            var listarPedidoEstilo = from pedidosEstilo in database.CO_PedidoEstilo
                                     where pedidosEstilo.Estilo_Id == this.EstiloId || this.EstiloId < 0
                                     select pedidosEstilo;

            var listaOrdenProduccionDet = from ordenDetalle in database.PR_OrdenProduccionDetalle
                                          where ordenDetalle.PR_OrdenProduccion.Estilo_Id == this.EstiloId || this.EstiloId < 0
                                          select ordenDetalle;

            foreach (var item in listarPedidoEstilo)
            {
                if (!listaOrdenProduccionDet.ToList().Exists(c => c.PedCom_Id == item.PedCom_Id && c.PR_OrdenProduccion.Estilo_Id == item.Estilo_Id))
                {
                    var pedidoCompra = listarQuery.ToList().Find(c => c.PedCom_Id == item.PedCom_Id);
                    if (pedidoCompra != null && !lstPedidoCompra.ToList().Exists(c => c.PedCom_Id == item.PedCom_Id))
                        lstPedidoCompra.Add(pedidoCompra);
                }
            }

            var listaContadores = from pedidosTallas in database.CO_PedidoTalla
                                  where pedidosTallas.Estilo_Id == this.EstiloId || this.EstiloId < 0
                                  group pedidosTallas by pedidosTallas.CO_PedidoColor.PedCom_Id into g
                                  select new
                                  {
                                      CodigoPedido = g.Key,
                                      PrendasProducir = g.Sum(c => c.PedTal_CantidadProducida),
                                      PrendasSolicitadas = g.Sum(c => c.PedTal_CantidadSolicitada),
                                      Total = g.Sum(c => c.PedTal_CantidadSolicitada * c.PedTal_Precio)
                                  };

            foreach (var item in listaContadores)
            {
                PedidoContadorList.Add(new PedidoContador()
                {
                    CodigoPedido = item.CodigoPedido,
                    PrendasProducir = item.PrendasProducir.Value,
                    PrendasSolicitadas = item.PrendasSolicitadas.Value,
                    Total = item.Total.Value
                });
            }

            var listarQuery1 = lstPedidoCompra.Skip((gvPager.CurrentPage - 1) * gvPager.PageSize).Take(gvPager.PageSize).ToList();

            gvPedidoCompras.DataSource = listarQuery1;
            gvPedidoCompras.DataBind();

            int totalReg = listarQuery1.Count();

            if (totalReg > 0)
            {
                gvPedidoCompras.UseAccessibleHeader = false;
                gvPedidoCompras.HeaderRow.TableSection = TableRowSection.TableHeader;
                gvPager.Visible = true;
                gvPager.TotalRowCount = totalReg;                
            }
            else
            {                
                gvPager.Visible = false;
            }

            lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, totalReg);
            
            mpeBusquedaPedidoCompra.Show();
        }       


        protected void btnMostrarModal_Click(object sender, EventArgs e)
        {
            ListarPedidoCompras();
            
        }
       
    }
}